package validate

import (
	"regexp"
	"strings"

	"github.com/gogf/gf/v2/errors/gerror"
)

// StockCode 验证股票代码格式
func StockCode(code string) error {
	if code == "" {
		return gerror.New("股票代码不能为空")
	}

	// 去除空格
	code = strings.TrimSpace(code)
	
	// 股票代码长度验证（6位数字）
	if len(code) != 6 {
		return gerror.New("股票代码必须为6位数字")
	}

	// 检查是否为纯数字
	matched, err := regexp.MatchString(`^\d{6}$`, code)
	if err != nil {
		return gerror.Wrap(err, "股票代码格式验证失败")
	}
	if !matched {
		return gerror.New("股票代码必须为6位数字")
	}

	return nil
}

// StockName 验证股票名称
func StockName(name string) error {
	if name == "" {
		return gerror.New("股票名称不能为空")
	}

	name = strings.TrimSpace(name)
	if len(name) == 0 {
		return gerror.New("股票名称不能为空")
	}

	if len(name) > 100 {
		return gerror.New("股票名称长度不能超过100个字符")
	}

	return nil
}

// Market 验证市场代码
func Market(market string) error {
	if market == "" {
		return gerror.New("市场代码不能为空")
	}

	market = strings.ToUpper(strings.TrimSpace(market))
	validMarkets := []string{"SH", "SZ", "BJ"}
	
	for _, validMarket := range validMarkets {
		if market == validMarket {
			return nil
		}
	}

	return gerror.New("市场代码必须为SH、SZ或BJ")
}

// Industry 验证行业
func Industry(industry string) error {
	if industry == "" {
		return nil // 行业可以为空
	}

	industry = strings.TrimSpace(industry)
	if len(industry) > 100 {
		return gerror.New("行业名称长度不能超过100个字符")
	}

	return nil
}

// PositiveFloat 验证正浮点数
func PositiveFloat(value float64, fieldName string) error {
	if value < 0 {
		return gerror.Newf("%s不能为负数", fieldName)
	}
	return nil
}

// Email 验证邮箱格式
func Email(email string) error {
	if email == "" {
		return gerror.New("邮箱不能为空")
	}

	pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
	matched, err := regexp.MatchString(pattern, email)
	if err != nil {
		return gerror.Wrap(err, "邮箱格式验证失败")
	}
	if !matched {
		return gerror.New("邮箱格式不正确")
	}

	return nil
}

// Phone 验证手机号格式
func Phone(phone string) error {
	if phone == "" {
		return gerror.New("手机号不能为空")
	}

	// 中国大陆手机号格式
	pattern := `^1[3-9]\d{9}$`
	matched, err := regexp.MatchString(pattern, phone)
	if err != nil {
		return gerror.Wrap(err, "手机号格式验证失败")
	}
	if !matched {
		return gerror.New("手机号格式不正确")
	}

	return nil
}

// TagName 验证标签名称
func TagName(name string) error {
	if name == "" {
		return gerror.New("标签名称不能为空")
	}

	name = strings.TrimSpace(name)
	if len(name) == 0 {
		return gerror.New("标签名称不能为空")
	}

	if len(name) > 100 {
		return gerror.New("标签名称长度不能超过100个字符")
	}

	return nil
}

// TagCategory 验证标签分类
func TagCategory(category string) error {
	if category == "" {
		return gerror.New("标签分类不能为空")
	}

	category = strings.TrimSpace(category)
	validCategories := []string{"industry", "concept", "risk", "market_cap", "custom"}
	
	for _, validCategory := range validCategories {
		if category == validCategory {
			return nil
		}
	}

	return gerror.New("标签分类必须为industry、concept、risk、market_cap或custom")
}

// ColorCode 验证颜色代码
func ColorCode(color string) error {
	if color == "" {
		return nil // 颜色可以为空，使用默认值
	}

	// 支持#开头的6位十六进制颜色代码
	pattern := `^#[0-9a-fA-F]{6}$`
	matched, err := regexp.MatchString(pattern, color)
	if err != nil {
		return gerror.Wrap(err, "颜色代码格式验证失败")
	}
	if !matched {
		return gerror.New("颜色代码格式不正确，应为#开头的6位十六进制数")
	}

	return nil
}

// PoolName 验证股票池名称
func PoolName(name string) error {
	if name == "" {
		return gerror.New("股票池名称不能为空")
	}

	name = strings.TrimSpace(name)
	if len(name) == 0 {
		return gerror.New("股票池名称不能为空")
	}

	if len(name) > 100 {
		return gerror.New("股票池名称长度不能超过100个字符")
	}

	return nil
}

// PoolType 验证股票池类型
func PoolType(poolType string) error {
	if poolType == "" {
		return gerror.New("股票池类型不能为空")
	}

	poolType = strings.TrimSpace(poolType)
	validTypes := []string{"static", "dynamic"}
	
	for _, validType := range validTypes {
		if poolType == validType {
			return nil
		}
	}

	return gerror.New("股票池类型必须为static或dynamic")
}

// PositiveInt 验证正整数
func PositiveInt(value int, fieldName string) error {
	if value <= 0 {
		return gerror.Newf("%s必须为正整数", fieldName)
	}
	return nil
}

// Range 验证数值范围
func Range(value, min, max float64, fieldName string) error {
	if value < min || value > max {
		return gerror.Newf("%s必须在%.2f到%.2f之间", fieldName, min, max)
	}
	return nil
}

// IntRange 验证整数范围
func IntRange(value, min, max int, fieldName string) error {
	if value < min || value > max {
		return gerror.Newf("%s必须在%d到%d之间", fieldName, min, max)
	}
	return nil
}